package com.biometric.core.support

import androidx.biometric.BiometricManager
import androidx.core.hardware.fingerprint.FingerprintManagerCompat
import com.biometric.core.checker.FaceCapableChecker
import com.biometric.core.retriever.AppContext

/**
 * 配合[FaceCapableChecker]，[FaceCapableChecker] 是判断设备是否具备应用调用人脸验证能力
 * FaceAuthCallableRule 则是判断人脸解锁是否可以调用。当 FaceAuthChecker#check 返回 true 且
 * FaceAuthEnableRule#meet 也返回true,表明当前设备支持人脸解锁且当前可以调用人脸解锁能力
 */
interface FaceAuthCallableRule {

    fun isCallable(): Boolean

    companion object {
        val default = object : FaceAuthCallableRule {
            private val biometricManager by lazy { BiometricManager.from(AppContext.get()) }
            private val fingerprintManagerCompat by lazy { FingerprintManagerCompat.from(AppContext.get()) }
            // 针对三星设备，如果人脸和指纹均支持但没有录入指纹数据的情况下，人脸解锁是可以单独调用的。
            // 如果同时录入了人脸和指纹数据，则认为不支持人脸识别
            override fun isCallable(): Boolean {
                return biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK) == BiometricManager.BIOMETRIC_SUCCESS
                        && fingerprintManagerCompat.hasEnrolledFingerprints().not()
            }

        }
    }
}